﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;

namespace KELT.Controls.Timeline.TimelineChart
{
    /// <summary>
    /// XAML 파일에서 이 사용자 지정 컨트롤을 사용하려면 1a 또는 1b단계를 수행한 다음 2단계를 수행하십시오.
    ///
    /// 1a단계) 현재 프로젝트에 있는 XAML 파일에서 이 사용자 지정 컨트롤 사용.
    /// 이 XmlNamespace 특성을 사용할 마크업 파일의 루트 요소에 이 특성을 
    /// 추가합니다.
    ///
    ///     xmlns:MyNamespace="clr-namespace:KETL_v5.Controls.Timeline.TimelineChart"
    ///
    ///
    /// 1b단계) 다른 프로젝트에 있는 XAML 파일에서 이 사용자 지정 컨트롤 사용.
    /// 이 XmlNamespace 특성을 사용할 마크업 파일의 루트 요소에 이 특성을 
    /// 추가합니다.
    ///
    ///     xmlns:MyNamespace="clr-namespace:KETL_v5.Controls.Timeline.TimelineChart;assembly=KETL_v5.Controls.Timeline.TimelineChart"
    ///
    /// 또한 XAML 파일이 있는 프로젝트의 프로젝트 참조를 이 프로젝트에 추가하고
    /// 다시 빌드하여 컴파일 오류를 방지해야 합니다.
    ///
    ///     솔루션 탐색기에서 대상 프로젝트를 마우스 오른쪽 단추로 클릭하고
    ///     [참조 추가]->[프로젝트]를 차례로 클릭한 다음 이 프로젝트를 찾아서 선택합니다.
    ///
    ///
    /// 2단계)
    /// 계속 진행하여 XAML 파일에서 컨트롤을 사용합니다.
    ///
    ///     <MyNamespace:ChartAnimationObject/>
    ///
    /// </summary>
    public class ChartAnimationObject : ListBoxItem
    {
        static ChartAnimationObject()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ChartAnimationObject), new FrameworkPropertyMetadata(typeof(ChartAnimationObject)));

            StartTimeProperty = DependencyProperty.Register("StartTime", typeof(int), typeof(ChartAnimationObject), new PropertyMetadata(0, OnStartTimeChanged));
            EndTimeProperty = DependencyProperty.Register("EndTime", typeof(int), typeof(ChartAnimationObject), new PropertyMetadata(1, OnEndTimeChanged));
            DurationProperty = DependencyProperty.Register("Duration", typeof(int), typeof(ChartAnimationObject), new PropertyMetadata(1, OnDurationChanged));
        }

        #region DependencyProperty
        
        public static DependencyProperty StartTimeProperty { private set; get; }
        public static DependencyProperty EndTimeProperty { private set; get; }
        public static DependencyProperty DurationProperty { private set; get; }
        
        public int StartTime
        {
            set
            {
                if (value < 0)
                    value = 0;

                SetValue(StartTimeProperty, value); 
            }
            get { return (int)GetValue(StartTimeProperty); }
        }

        public int EndTime
        {
            set 
            {
                SetValue(EndTimeProperty, value);
                SetValue(DurationProperty, EndTime - StartTime);
            }
            get { return (int)GetValue(EndTimeProperty); }
        }

        public int Duration
        {
            set { SetValue(DurationProperty, value); }
            get { return (int)GetValue(DurationProperty); }
        }

        
        static void OnStartTimeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            (obj as ChartAnimationObject).OnStartTimeChanged(args);
        }

        void OnStartTimeChanged(DependencyPropertyChangedEventArgs args)
        {
            // if StartTime > EndTime then Swqp Value
            // It is either to EndTimeChanged Function
        }


        static void OnEndTimeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            (obj as ChartAnimationObject).OnEndTimeChanged(args);
        }

        void OnEndTimeChanged(DependencyPropertyChangedEventArgs args)
        {

        }

        static void OnDurationChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            (obj as ChartAnimationObject).OnDurationChanged(args);
        }

        void OnDurationChanged(DependencyPropertyChangedEventArgs args)
        {

        }


        public void NotifyPropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        #endregion
    }
}
